/**
 * 依赖收集相关操作
 * 收集渲染 Watcher
 */

let did = 0;
class Dep {
  constructor() {
    this.id = did++;
    this.watchers = []; // 存放渲染 Watcher
  }

  // watcher 和 Dep 是多对多关系
  depend() {
    // 调用 Watcher 的 addDep 函数，添加对应的依赖 Dep， 让 Watcher 记住当前的 Dep
    Dep.target && Dep.target.addDep(this);
  }

  /**
   * 存储对应的 Watcher
   * @param {*} watcher Watcher 实例 
   */
  addWatcher(watcher) {
    this.watchers.push(watcher);
  }

  notify() {
    // 触发视图更新
    this.watchers.forEach(watcher => watcher.update());
  }
}

const stack = []; // 一个变量可能存放多个 watcher

export function pushTarget(watcher) {
  // 只有在渲染的时候有 Dep.target
  Dep.target = watcher; // 保存当前的一个 watecher， 它是属于谁的
  stack.push(Dep.target);
}
export function popTarget() {
  stack.pop();
  Dep.target = stack[stack.length - 1];
}

export default Dep;